package com.hsh.tools;

import com.hsh.tools.handler.BusinessException;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * <p>
 *
 * </p>
 *
 * @author huangsihai
 * @date 2021/10/13 17:09
 */
public class SearchUtils {

    private SearchUtils() {
    }

    /**
     * 有序字母
     */
    private static final String[] LETTER = {
            "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
            "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ"
    };

    @Data
    @Accessors(chain = true)
    private static class ResultBase {
        // 是否存在
        private boolean flag;
        // 当前范围的所有值【含首尾】
        private List<String> letterRangeData;
    }

    /**
     * 查找当前数据是否存在指定范围（不区分大小写）
     *
     * @param todoValue  查询的值
     * @param rangeLeft  范围起点
     * @param rangeRight 范围终点
     * @return bool
     */
    public static ResultBase specifiedRangeFind(String todoValue, String rangeLeft, String rangeRight) {
        if (StringUtils.isEmpty(todoValue)) {
            throw new BusinessException("查询的值不能为空！");
        }
        if (StringUtils.isEmpty(rangeLeft)) {
            throw new BusinessException("范围起点不能为空！");
        }
        if (StringUtils.isEmpty(rangeRight)) {
            throw new BusinessException("范围终点不能为空！");
        }
        final List<String> letterList = Arrays.asList(LETTER);
        Set<String> set = new HashSet<>(letterList);
        if (!set.contains(rangeLeft.toUpperCase())) {
            throw new BusinessException("范围起点不能为空！");
        }
        if (!set.contains(rangeRight.toUpperCase())) {
            throw new BusinessException("范围终点不能为空！");
        }
        if (rangeLeft.toUpperCase().hashCode() > rangeRight.toUpperCase().hashCode()) {
            throw new BusinessException("范围起点不能大于范围终点！");
        }

        int rangeLeftIndex = 0, rangeRightIndex = 0;
        for (int i = 0; i < LETTER.length; i++) {
            if (LETTER[i].equals(rangeLeft)) {
                rangeLeftIndex = i;
            }
            if (LETTER[i].equals(rangeRight.toUpperCase())) {
                rangeRightIndex = i;
                // 范围终点获取到值时，起点以获取到值
                break;
            }
        }

        List<String> data = letterList.subList(rangeLeftIndex, rangeRightIndex + 1);

        ResultBase result = new ResultBase();
        result.setFlag(data.contains(todoValue.toUpperCase())).setLetterRangeData(data);
        return result;
    }

}
